home *** CD-ROM | disk | FTP | other *** search
/ 10,000 Great Games / 10,000 Great Games.iso / Product / 66 / data1.cab / Source_Files / Src / Weapon.cpp < prev    next >
C/C++ Source or Header  |  2000-01-16  |  4KB  |  178 lines

  1. #include "stdafx.h"
  2.  
  3. cWeapon *weapons = 0, *weapons_belowscreen = 0, *weapons_abovescreen = 0;
  4.  
  5. cWeapon::cWeapon(int _x, int _y, cProperties *_orig, char *startseq)
  6.         : cGameObject(_orig)
  7.     add((cList **)&weapons);
  8.  
  9.     // Set animation
  10.  
  11.     set_sequence(startseq, TRUE);
  12.  
  13.     // Set position
  14.     
  15.     set_position(_x, _y);
  16.  
  17.     // Set soundsequence 
  18.  
  19.     set_soundsequence(startseq, TRUE);
  20.  
  21.     // Make sure object is drawn
  22.     
  23.     make_dirty();
  24.     
  25.     // Set other
  26.     
  27.     armor = orig->params->get_int("*ARMOR", 1);
  28.     armor_power = orig->params->get_int("*ARMOR_POWER", 0);
  29.     push_power = orig->params->get_int("*PUSH_POWER", 0);
  30.     instant_push_speed = orig->params->get_fix("*INSTANT_PUSH_SPEED", 0);
  31.     ignore_platforms = orig->params->get_fix("*IGNORE_PLATFORMS", 0) * sec;
  32.     invulnerable = orig->params->get_bool("*INVULNERABLE", FALSE);
  33.     parts_on_kill = orig->params->get_int("*PARTS_ON_KILL", 0);    
  34.     push_moving_direction = TRUE;
  35.     move_object_after_hit = TRUE;    
  36.  
  37.     owner = 0;
  38. }
  39.  
  40. cWeapon::~cWeapon()
  41. {
  42.     // Don't create effects when not on screen
  43.  
  44.     if (!y_on_screen())
  45.         return;
  46.  
  47.     // Create effect
  48.     
  49.     cEffect *e = new cEffect (x, y, orig, "EXPLODE");
  50.     e->set_rotation_angle(get_rotation_angle());
  51.  
  52.     // Make parts
  53.  
  54.     cParts::make(x, y, parts_on_kill);
  55. }
  56.  
  57. int cWeapon::control()
  58. {
  59.     cMovable::control();
  60.     
  61.     // Check if in inpenetrable wall and influenced by it
  62.  
  63.     if (influenced_by_inpenetrable && check_radial_boundaries(circle_bounds, structures, cStructure::check_inpenetrable) != 0)
  64.         explode = TRUE;
  65.  
  66.     // Only derived classes should exist
  67.  
  68.     return FALSE;
  69. }
  70.  
  71. void cWeapon::save()
  72. {
  73.     cGameObject::save();
  74. }
  75.  
  76. void cWeapon::hit(fix, cWeapon *w)
  77. {
  78.     armor -= w->armor_power;
  79.     
  80.     if (armor <= 0)
  81.         explode = TRUE;
  82. }
  83.  
  84. static int hit_bubble(cMovable *_w, cDisplayable *_b, cCircle *, cCircle *)
  85. {
  86.     cWeapon *w = (cWeapon *)_w;
  87.     cBubble *b = (cBubble *)_b;
  88.     
  89.     // Hit
  90.     
  91.     b->hit(w);
  92.     
  93.     // Return
  94.     
  95.     return TRUE;
  96. }
  97.  
  98. static int hit_player(cMovable *_w, cDisplayable *_c, cCircle *, cCircle *)
  99. {
  100.     cWeapon *w = (cWeapon *)_w;
  101.     cCharacter *c = (cCharacter *)_c;
  102.  
  103.     int was_active = c->is_active();
  104.  
  105.     // Hit
  106.  
  107.     c->hit(w->armor_power);
  108.  
  109.     // Push
  110.     
  111.     if (w->push_moving_direction)
  112.         c->push(w->movement_direction(), w->push_power, w->instant_push_speed, w->ignore_platforms);
  113.     else
  114.         c->push(angle(c->x - w->x, c->y - w->y), w->push_power, w->instant_push_speed, w->ignore_platforms);
  115.  
  116.     // Score keeping
  117.         
  118.     if (was_active && w->owner != 0 && w->owner != c)
  119.         w->owner->modify_score(w->score_value + (c->is_active()? 0 : 50), c);
  120.  
  121.     // Return
  122.     
  123.     return TRUE;
  124. }
  125.  
  126. static int check_hit_weapon(cMovable *, cDisplayable *t, cCircle *, cCircle *)
  127. {
  128.     return !((cWeapon *)t)->invulnerable;
  129. }
  130.  
  131. static int hit_weapon(cMovable *_w, cDisplayable *_t, cCircle *, cCircle *)
  132. {
  133.     cWeapon *w = (cWeapon *)_w;
  134.     cWeapon *t = (cWeapon *)_t;
  135.     
  136.     if (!t->invulnerable)
  137.     {
  138.         if (w->push_moving_direction)
  139.             t->hit(w->movement_direction(), w);
  140.         else
  141.             t->hit(angle(t->x - w->x, t->y - w->y), w);
  142.         
  143.         return TRUE;
  144.     }
  145.     
  146.     return FALSE;
  147. }
  148.  
  149. static int hit_bonus(cMovable *, cDisplayable *b, cCircle *, cCircle *)
  150. {
  151.     ((cBonus *)b)->explode = TRUE;
  152.  
  153.     return TRUE;
  154. }
  155.  
  156. int cWeapon::check_radial_hit_one(cCircle *c, int only_check)
  157. {
  158.     cDisplayable *o = not_owner_timeout? owner : 0;
  159.  
  160.     return check_radial_boundaries(c, bubbles, only_check? 0 : hit_bubble, o, move_object_after_hit) != 0 ||
  161.            check_radial_boundaries(c, players, only_check? 0 : hit_player, o, move_object_after_hit) != 0 ||
  162.            check_radial_boundaries(c, weapons, only_check? check_hit_weapon : hit_weapon, o, move_object_after_hit) != 0 ||
  163.            check_radial_boundaries(c, bonus, only_check? 0 : hit_bonus, o, move_object_after_hit) != 0;
  164. }
  165.  
  166. int cWeapon::check_radial_hit_more(cCircle *c, int only_check)
  167. {
  168.     cDisplayable *o = not_owner_timeout? owner : 0;
  169.  
  170.     int rv1 = check_radial_boundaries(c, bubbles, only_check? 0 : hit_bubble, o, move_object_after_hit) != 0,
  171.         rv2 = check_radial_boundaries(c, players, only_check? 0 : hit_player, o, move_object_after_hit) != 0,
  172.         rv3 = check_radial_boundaries(c, weapons, only_check? check_hit_weapon : hit_weapon, o, move_object_after_hit) != 0,
  173.         rv4 = check_radial_boundaries(c, bonus, only_check? 0 : hit_bonus, o, move_object_after_hit) != 0;
  174.     
  175.     return rv1 || rv2 || rv3 || rv4;
  176. }
  177.